package com.obelisco.vista.herramientas;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JExcelApiExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import nextapp.echo2.webcontainer.WebContainerServlet;

import org.springframework.web.context.support.ServletContextResource;

import com.obelisco.modelo.data.auxiliares.Archivo;
import com.obelisco.vista.componentes.ListaBase;

public class ReporteUtils {
	
	static String construirHTML(String rutaArchivoReporte, List<Object> listaDeDatos, Map<Object, Object> parametros)
		throws JRException, IOException {
		ServletContextResource resource =
			new ServletContextResource(WebContainerServlet.getActiveConnection().getServlet().getServletContext(), rutaArchivoReporte);
		JRBeanCollectionDataSource fuenteDeDatos = new JRBeanCollectionDataSource(listaDeDatos);
		JRHtmlExporter exporter = new JRHtmlExporter();
		StringBuffer sb = new StringBuffer();
		exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER, sb);
		exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, false);
		exporter.setParameter(JRExporterParameter.JASPER_PRINT,
				JasperFillManager.fillReport(resource.getFile().getAbsolutePath(), parametros, fuenteDeDatos));
		exporter.exportReport();
		return sb.toString();
	}

	static Map<String, Object> agregarparametrosGenerales(Map<String, Object> parametros, Object objeto) {
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("rutaServlet",
				WebContainerServlet.getActiveConnection().getServlet().getServletContext().getRealPath("/"));
		if (objeto instanceof ListaBase) {
			ListaBase lstBase = (ListaBase) objeto;	
			if (lstBase.getParametrosImprimir() != null)
				parameters.putAll(lstBase.getParametrosImprimir());
		}
		/*
		parameters.put("p_planestudioactivo", PlanEstudio.PLAN_ESTUDIO_ACTIVO);			
		parameters.put("p_lapsoacademicoiniciado", LapsoAcademico.LAPSO_ACADEMICO_INICIADO);
		parameters.put("p_lapsoacademicointensivo", LapsoAcademico.PERIODO_INTENSIVO);
					
		if (Aplicacion.getApp().getContexto().getDecanatoActual().getJeferegistroacademico() != null)
		{					
			parameters.put("p_diminutivojeferegistro", buscarDiminutivoNivelAcademicoMayor(Aplicacion.getApp().getContexto().getDecanatoActual().getJeferegistroacademico()));						
			parameters.put("p_jeferegistro", Aplicacion.getApp().getContexto().getDecanatoActual().getJeferegistroacademico().getNombrecorto());
			parameters.put("p_cedulajeferegistro", Aplicacion.getApp().getContexto().getDecanatoActual().getJeferegistroacademico().getCedula());
		}
						
		parameters.put("p_nombredecanato", Aplicacion.getApp().getContexto().getDecanatoActual().getNombre());        
		parameters.put("p_direcciondecanato", Aplicacion.getApp().getContexto().getDecanatoActual().getDireccion());
		parameters.put("p_telefonodecanato", Aplicacion.getApp().getContexto().getDecanatoActual().getTelefono());
		InputStream logoDecanato = new ByteArrayInputStream(Aplicacion.getApp().getContexto().getDecanatoActual().getLogo()); 
		InputStream logoUniversidad= new ByteArrayInputStream(Aplicacion.getApp().getContexto().getDecanatoActual().getUniversidad().getLogo());        
		parameters.put("p_logodecanato", logoDecanato);
		parameters.put("p_logouniversidad", logoUniversidad);
		parameters.put("p_fechaactual", fechaActualConFormato());
		*/
		if (parametros != null)
			parameters.putAll(parametros);
		return parameters;
	}
	
	static Archivo construirArchivoPdf(String rutaArchivoReporte, Collection<?> listaDeDatos,
			Map<String, Object> parametros) {
		Archivo archivo = new Archivo();
		String nombreArchivo = (String)parametros.get("nombre_archivo");
		archivo.setNombre(nombreArchivo != null ? nombreArchivo + ".pdf" : "");
		try {
			ServletContextResource resource = new ServletContextResource(WebContainerServlet.getActiveConnection().getServlet().getServletContext(), rutaArchivoReporte);
			JRBeanCollectionDataSource fuenteDeDatos = new JRBeanCollectionDataSource(listaDeDatos);
			String absolutPath = resource.getFile().getAbsolutePath();
			byte[] bytes = JasperRunManager.runReportToPdf(absolutPath, parametros, fuenteDeDatos);			
			archivo.setContenido(bytes);
			archivo.setTipo("application/pdf");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		return archivo;
	}
	
	static Archivo construirArchivoXls(String rutaArchivoReporte, List<Object> listaDeDatos,
			Map<Object, Object> parametros) {
		Archivo archivo = new Archivo();
		String nombreArchivo = (String)parametros.get("nombre_archivo");
		archivo.setNombre(nombreArchivo != null ? nombreArchivo + ".xls" : "");
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ServletContextResource resource = new ServletContextResource(WebContainerServlet.getActiveConnection().getServlet().getServletContext(), rutaArchivoReporte);
			JRBeanCollectionDataSource fuenteDeDatos = new JRBeanCollectionDataSource(listaDeDatos);
			JasperPrint jasperPrint=JasperFillManager.fillReport (resource.getFile().getAbsolutePath(), parametros, fuenteDeDatos);
			
			JExcelApiExporter exporter = new JExcelApiExporter();
			exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
			exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);				
			exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
			//exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
			exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.TRUE);
			exporter.setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE);
			exporter.exportReport();
			archivo.setTipo("application/vnd.ms-excel");
			archivo.setContenido(baos.toByteArray());
		}
		catch(JRException e) {
			e.printStackTrace();
		}
		catch(Exception e) {
			e.printStackTrace();
		}
		return archivo;
	}
}
